在 JS 的 ES6 中,引進了一項新的概念,就是區塊作用域,而他實際的應用就是昨天講到變量聲明裡面的 let 和 const,而今天我們就來好好了解 let、const 的概念,還有 var 到底和他們有什麼差別吧。
在進入正題以前,先來了解區域變數和全域變數的概念,這樣有助於你理解下面作用域的概念是什麼。用以下程式碼當作例子講解:
let global = 1;
for(let i = 0; i < 10; i++) {
let block = 2;
console.log(global); //可運行
console.log(block); //可運行
}
console.log(block); //不可運行,會報錯,block為區域變數,不能在被宣告的區塊外被使用
如何區分:
在程式碼中,我們區分全域或是區域變數的方法,最主要是以區塊為主,只要是在區塊中的變數就視同為區域變數,而區塊的種類有很多,函數是一個區塊,for 判斷式是一個區塊,if/else 判斷式也算是一個區塊,總括來說只要被大括號括起來的(包括判斷語句)都能算是一個區塊,而只要不是在區塊內宣告的變數,都視做為全域變數。
功能差別:
全域變數:此變數可以在任何地方被使用。例如 global 變數可以在 for 判斷式裡運作。
區域變數:此變數只能在宣告該變數的區域被取用。例如 block 變數只能在宣告他的 for 區塊裡被使用,在那以外的地方不能被使用,會報錯。
變量聲明:var
概念:在前面了解到了區域和全域變數的差別,而函數作用域的意思就是,他只認在函數內宣告的變數為區域變數,其他的都視為全域變數。以 var 來當作變量聲明的除了昨天說的特性,還有今天講的這個。
缺點:這樣會有一個致命的缺點就是,就是函數之外宣告的變數都會是全域變數,這就會導致可能不小心改到一些重要的值,而且在命名時如果名字一樣,還會不小改到,專案規模小是可以立即察覺到,但如果規模一大,就等於是大海撈針,要一個一個慢慢找,因此 JS 在 ES6 中引進了區塊作用域的概念,改善了這一問題。
變量聲明:let、const
概念:如果以 let 和 const 來當作變量聲明,可以很好的解決以上問題,因為區塊作用域的概念是,只要在任何區塊內宣告的函數都視為區塊變數,其餘為全域變數,很好的改善了函數作用域會遇到的問題。
以下我就用一張圖來總結今天在區塊、函數作用域中區塊變數和全域變數的差別: